/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.faesa.acervo.view.mbeans;

import br.faesa.acervo.business.ejb.AlunoDAO;
import br.faesa.acervo.business.ejb.EmprestimoDAO;
import br.faesa.acervo.business.ejb.LivroDAO;
import br.faesa.acervo.entity.Aluno;
import br.faesa.acervo.entity.Emprestimo;
import br.faesa.acervo.entity.Livro;
import br.faesa.acervo.util.DataUtil;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author aluno.faesa
 */
@ManagedBean(name = "emprestimoCadastroForm")
@ViewScoped
public class EmprestimoCadastroFormBean implements Serializable {

    private Long matricula;
    
    private Emprestimo emprestimo;
    
    private Livro livro;
    
    @EJB
    private AlunoDAO alunoDAO;
    
    @EJB
    private LivroDAO livroDAO;

    @EJB
    private EmprestimoDAO emprestimoDAO;
    
    public EmprestimoCadastroFormBean() { }
    
    @PostConstruct
    public void init()
    {
        
        final String SELECTED_ID = "idLivro";
        
        Map<String, String> paramMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        
        
        if(paramMap.get(SELECTED_ID) != null){
            
            Long idLivro = Long.valueOf(paramMap.get(SELECTED_ID));
            
            this.livro = livroDAO.find(idLivro);
            
            this.emprestimo = new Emprestimo();
            
            this.emprestimo.setLivro(livro);
            this.emprestimo.setDtEmprestimo(new Date());
        }else{
            FacesUtils.fatal("Acesse a página a partir da seleção de um Livro!");
        }
        
    }
    
    public String onBotaoOKClick()
    {
        boolean erro = false;

        if(DataUtil.compararDatasSemHora(this.emprestimo.getDtEmprestimo(), new Date()) < 0){
            FacesUtils.error("A Data da Reserva deve ser maior ou igual que a data atual");
            erro = true;
        }
        
        if(DataUtil.compararDatasSemHora(this.emprestimo.getDtDevolucao(), this.emprestimo.getDtEmprestimo()) <= 0){
            FacesUtils.error("Data da devolução deve ser maior que a Data da Reserva");
            erro = true;
        }
        
        Aluno aluno = this.alunoDAO.findByMatricula(this.matricula);
        this.emprestimo.setAluno(aluno);
        
        if(aluno == null){
            FacesUtils.error("Matrícula informada não encontrada");
            erro = true;
        }
        
        Long count = emprestimoDAO.countEmprestimosByIntervalo(this.emprestimo.getDtEmprestimo(), this.emprestimo.getDtDevolucao(), this.emprestimo.getLivro());
        
        if(count > 0){
            FacesUtils.error("Já existe reserva para o período informado!");
            erro = true;
        }
        
        if(erro){
            return null;
        }
        
        this.emprestimo.setLivro(livro);
        
        emprestimoDAO.salvar(emprestimo);
        
        FacesUtils.info("Reserva efetuada com sucesso!");
        
        return "/livroConsultaForm.xhtml";
    }

    public Long getMatricula() {
        return matricula;
    }

    public void setMatricula(Long matricula) {
        this.matricula = matricula;
    }

    public Emprestimo getEmprestimo() {
        return emprestimo;
    }

    public void setEmprestimo(Emprestimo emprestimo) {
        this.emprestimo = emprestimo;
    }
    
    
}
